package br.com.educa.modelo.academico;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;
import javax.persistence.TypedQuery;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.json.RooJson;
import org.springframework.roo.addon.serializable.RooSerializable;
import org.springframework.roo.addon.tostring.RooToString;
import org.springframework.transaction.annotation.Transactional;

import br.com.educa.modelo.disciplinar.Elogios;
import br.com.educa.modelo.disciplinar.Meritos;
import br.com.educa.modelo.disciplinar.Punicoes;
import br.com.educa.modelo.financeiro.LancamentosAlunos;
import br.com.educa.modelo.pessoa.Pessoas;
import br.com.educa.modelo.pessoa.enumerator.Cor;
import br.com.educa.modelo.pessoa.enumerator.Religiao;
import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;

public class ComportamentosAlunos implements Serializable {

    private Long id;

    private Integer version;

    @ManyToOne
    @JoinColumn(name = "pessoaAluno", referencedColumnName = "id", nullable = false)
    private Pessoas pessoaAluno;

    private String matricula;

    private String ativo;

    private String escolaOrigem;

    @Enumerated(EnumType.STRING)
    private Cor cor;

    private String filhoDe;

    private String pai;

    private String mae;
    
    @OneToMany(mappedBy = "aluno")
    private Set<LancamentosAlunos> lancamentos;
    
    //incluir o tipo do responsável
    
    @Pattern(regexp = "^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$", message = "Email inválido!")
    private String emailResponsavel;

    @Enumerated(EnumType.STRING)
    private Religiao religiao;

    @NotNull
    private Double comportamento;
    
    @OneToMany(mappedBy = "aluno")
    private Set<Punicoes> punicoes;

    @OneToMany(mappedBy = "aluno")
    private Set<Elogios> elogios;
    
    @OneToMany(mappedBy = "aluno")
    private Set<Meritos> meritos;
    
    @PersistenceContext
    transient EntityManager entityManager;

    private static final long serialVersionUID = 1L;

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getVersion() {
        return this.version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public Pessoas getPessoaAluno() {
        return this.pessoaAluno;
    }

    public void setPessoaAluno(Pessoas pessoaAluno) {
        this.pessoaAluno = pessoaAluno;
    }

    public String getMatricula() {
        return this.matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public String getAtivo() {
        return this.ativo;
    }

    public void setAtivo(String ativo) {
        this.ativo = ativo;
    }

    public String getEscolaOrigem() {
        return this.escolaOrigem;
    }

    public void setEscolaOrigem(String escolaOrigem) {
        this.escolaOrigem = escolaOrigem;
    }

    public Cor getCor() {
        return this.cor;
    }

    public void setCor(Cor cor) {
        this.cor = cor;
    }

    public String getFilhoDe() {
        return this.filhoDe;
    }

    public void setFilhoDe(String filhoDe) {
        this.filhoDe = filhoDe;
    }

    public String getPai() {
        return this.pai;
    }

    public void setPai(String pai) {
        this.pai = pai;
    }

    public String getMae() {
        return this.mae;
    }

    public void setMae(String mae) {
        this.mae = mae;
    }

    public Religiao getReligiao() {
        return this.religiao;
    }

    public void setReligiao(Religiao religiao) {
        this.religiao = religiao;
    }

    public Double getComportamento() {
        return this.comportamento;
    }

    public void setComportamento(Double comportamento) {
        this.comportamento = comportamento;
    }

    public static final EntityManager entityManager() {
        EntityManager em = new ComportamentosAlunos().entityManager;
        if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");
        return em;
    }

    public static long countAlunoses() {
        return entityManager().createQuery("SELECT COUNT(o) FROM Alunos o", Long.class).getSingleResult();
    }

    public static List<br.com.educa.modelo.academico.ComportamentosAlunos> findAllAlunoses() {
        return entityManager().createQuery("SELECT o FROM Alunos o", ComportamentosAlunos.class).getResultList();
    }

    public static br.com.educa.modelo.academico.ComportamentosAlunos findAlunos(Long id) {
        if (id == null) return null;
        return entityManager().find(ComportamentosAlunos.class, id);
    }

    public static List<br.com.educa.modelo.academico.ComportamentosAlunos> findAlunosEntries(int firstResult, int maxResults) {
        return entityManager().createQuery("SELECT o FROM Alunos o", ComportamentosAlunos.class).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
    }

    @Transactional
    public void persist() {
        if (this.entityManager == null) this.entityManager = entityManager();
        this.entityManager.persist(this);
    }

    @Transactional
    public void remove() {
        if (this.entityManager == null) this.entityManager = entityManager();
        if (this.entityManager.contains(this)) {
            this.entityManager.remove(this);
        } else {
            ComportamentosAlunos attached = ComportamentosAlunos.findAlunos(this.id);
            this.entityManager.remove(attached);
        }
    }

    @Transactional
    public void flush() {
        if (this.entityManager == null) this.entityManager = entityManager();
        this.entityManager.flush();
    }

    @Transactional
    public void clear() {
        if (this.entityManager == null) this.entityManager = entityManager();
        this.entityManager.clear();
    }

    @Transactional
    public br.com.educa.modelo.academico.ComportamentosAlunos merge() {
        if (this.entityManager == null) this.entityManager = entityManager();
        ComportamentosAlunos merged = this.entityManager.merge(this);
        this.entityManager.flush();
        return merged;
    }

    public String toString() {
        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

    public String toJson() {
        return new JSONSerializer().exclude("*.class").serialize(this);
    }

    public static br.com.educa.modelo.academico.ComportamentosAlunos fromJsonToAlunos(String json) {
        return new JSONDeserializer<ComportamentosAlunos>().use(null, ComportamentosAlunos.class).deserialize(json);
    }

    public static String toJsonArray(Collection<br.com.educa.modelo.academico.ComportamentosAlunos> collection) {
        return new JSONSerializer().exclude("*.class").serialize(collection);
    }

    public static Collection<br.com.educa.modelo.academico.ComportamentosAlunos> fromJsonArrayToAlunoses(String json) {
        return new JSONDeserializer<List<ComportamentosAlunos>>().use(null, ArrayList.class).use("values", ComportamentosAlunos.class).deserialize(json);
    }

    public static TypedQuery<br.com.educa.modelo.academico.ComportamentosAlunos> findAlunosesByPessoaAluno(Pessoas pessoaAluno) {
        if (pessoaAluno == null) throw new IllegalArgumentException("The pessoaAluno argument is required");
        EntityManager em = ComportamentosAlunos.entityManager();
        TypedQuery<ComportamentosAlunos> q = em.createQuery("SELECT o FROM Alunos AS o WHERE o.pessoaAluno = :pessoaAluno order by o.id DESC", ComportamentosAlunos.class);
        q.setParameter("pessoaAluno", pessoaAluno);
        return q;
    }
    
    public static TypedQuery<br.com.educa.modelo.academico.ComportamentosAlunos> findComportamentoByAlunoses(ComportamentosAlunos aluno) {
        if (aluno == null) throw new IllegalArgumentException("The aluno argument is required");
        EntityManager em = ComportamentosAlunos.entityManager();
        TypedQuery<ComportamentosAlunos> q = em.createQuery("SELECT o FROM Alunos AS o WHERE o.pessoaAluno = :aluno order by o.id DESC", ComportamentosAlunos.class);
        q.setParameter("aluno", aluno);
        return q;
    }

	public Set<Punicoes> getPunicoes() {
        return this.punicoes;
    }

	public void setPunicoes(Set<Punicoes> punicoes) {
        this.punicoes = punicoes;
    }

	public Set<Elogios> getElogios() {
        return this.elogios;
    }

	public void setElogios(Set<Elogios> elogios) {
        this.elogios = elogios;
    }

	public Set<Meritos> getMeritos() {
        return this.meritos;
    }

	public void setMeritos(Set<Meritos> meritos) {
        this.meritos = meritos;
    }

	public String getEmailResponsavel() {
        return this.emailResponsavel;
    }

	public void setEmailResponsavel(String emailResponsavel) {
        this.emailResponsavel = emailResponsavel;
    }

	public Set<LancamentosAlunos> getLancamentos() {
        return this.lancamentos;
    }

	public void setLancamentos(Set<LancamentosAlunos> lancamentos) {
        this.lancamentos = lancamentos;
    }
}
